Class Readings, Assignments, Syllabus Topics

Reading, Lab Exercises, SemProjects
  • Readings:
    • For today:
    • For next class: LeCun Deep Learning 2015 Review
    • Next is:
  • Laboratory Exercises:
    • LE posted
    • LE6 is due this coming Thursday April 13th
  • Office Hours: (Class Canvas Calendar for Zoom Link)
    • Wednesdays @ 4:00 PM to 5:00 PM
    • Saturdays @ 3:00 PM to 4:00 PM
    • Office Hours are on Zoom, and recorded
  • Semester Projects
    • Office Hours for SemProjs: Mondays at 4pm on Zoom
    • DSCI 453 Students Biweekly Updates Due
      • Update # is Due ** **
    • DSCI 453 Students
      • Next Report Out # is Due
    • All DSCI 353/353M/453, E1453/2453 Students:
      • Peer Grading of Report Out is Due Friday
  • Exams
    • Final: Tuesday May 11th 2021, 12:00 PM to 3 PM

Syllabus

IT Fundamentals: Applied Data Science with R, Syllabus

The recipients of the 2019 Turing Award of ACM

Geoffrey Hinton, Yann Lecun and Yoshua Bengio

Hinton and LeCun’s Turing Award Lecture recordings

Types of Neural Networks

There are many different types of neural networks

As Howard Rheingold said,

“The neural network is this kind of technology that is not an algorithm, 
it is a network that has weights on it, 
and you can adjust the weights so that it learns. 
You teach it through trials.”
What are Artificial Neural Networks?
  • An artificial neural network is a system of hardware or software

    • that is patterned after the working of neurons
      • in the human brain and nervous system.

Artificial neural networks are

  • a variety of deep learning technology
  • which comes under the broad domain
    • of Artificial Intelligence.

Deep learning is a branch of Machine Learning

  • which uses different types of neural networks.

These algorithms are inspired by the way our brain functions

  • and therefore many experts believe they are our best shot
  • to moving towards real AI (Artificial Intelligence).

Deep learning is becoming especially exciting now

  • as we have more amounts of data
  • and larger neural networks to work with.

Moreover, the performance of neural networks

  • improves as they grow bigger and work with more and more data,
  • unlike other Machine Learning algorithms
    • which can reach a plateau after a point.

Figure 1. A mostly complete chart of Neural Networks

Figure 1. A mostly complete chart of Neural Networks

How do Neural Networks work?
  • A neural network has a large number of nodes.

    • These nodes (or processors) operate parallelly
      • but are arranged as layers.
    • The first layer receives the raw input
      • similar to how the optic nerve
      • receives the raw information in human beings.

Each successive layer then receives input

  • from the layer before it
    • and then passes on its output to the layer after it.
  • The last layer processes the final output.

Nodes make up each tier.

  • The nodes are highly interconnected
    • with the nodes in the tier before and after.
  • Each node in the neural network has its own sphere of knowledge,
    • including rules that it was programmed with
    • and rules it has learnt by itself.

The key to the efficacy of neural networks

  • is they are extremely adaptive and learn very quickly.
  • Each node weighs the importance of the input
    • it receives from the nodes before it.
  • The inputs that contribute the most towards the right output
    • are given the highest weight.
What are the Different Types of Neural Networks?
  • Different types of neural networks

    • use different principles
      • in determining their own rules.

There are many types of artificial neural networks, each with their unique strengths.

This Hinton video discusses the

  • different types of neural networks
  • and their applications in detail.

Neural Networks for Machine Learning, Class 2a, Geoffrey Hinton

Class 2a:An overview of the main types of neural networks

Figure 2. Geoffrey Hinton on Types of Neural Networks

Geoffrey Hinton
  • He has developed many of the most important advances in machine learning.

These papers are in your 3-readings / 2-articles

  • Backpropagation [@rumelhartLearningRepresentationsBackpropagating1986]
  • t-SNE for data visualization [@maatenVisualizingDataUsing2008]
  • Deep NNs for ImageNet Image Classification [@krizhevskyImageNetClassificationDeep2012a,@krizhevskyImageNetClassificationDeep2017]
  • Deep Learning [@lecunDeepLearning2015]
  • His Neural Networks for Machine Learning class videos playlist

Important types of neural networks and their applications

This is one of the simplest types of artificial neural networks.

In other words, data moves in only one direction

Unlike in more complex types of neural networks,

In a feedforward neural network,

Here is an example of a single layer feedforward neural network.

Feedforward Neural Network – Artificial Neuron

Figure 3. Feedforward Neural Network – Artificial Neuron

Feedforward neural networks are used in technologies like

A simple feedforward neural network is equipped to deal with data

Radial Basis Function Neural Network
  • A radial basis function

    • considers the distance of any point relative to the centre.

Such neural networks have two layers.

  • In the inner layer,
    • the features are combined with the radial basis function.

Then the output of these features is taken into account

  • when calculating the same output in the next time-step.

Here is a diagram which represents a radial basis function neural network.

Radial Basis Function Neural Network

knitr::include_graphics[width = 0.8\textwidth]("./figs/TypeNN-4-RBFNN.gif")

Figure 4. Radial Basis Function Neural Network

The radial basis function neural network is applied extensively

This neural network is used in the power restoration systems

Multilayer Perceptron
  • A multilayer perceptron has three or more layers.

    • It is used to classify data that cannot be separated linearly.
    • It is a type of artificial neural network that is fully connected.
    • This is because every single node in a layer
      • is connected to each node in the following layer.

A multilayer perceptron

  • uses a nonlinear activation function
    • (mainly hyperbolic tangent or logistic function).

Here’s what a multilayer perceptron looks like.

Multilayer Perceptron

Figure 5. Multilayer Perceptron

This type of neural network is applied extensively

  • in speech recognition
  • and machine translation technologies.
Convolutional Neural Network
  • A convolutional neural network(CNN)

    • uses a variation of the multilayer perceptrons.

A CNN contains one or more than one convolutional layers.

  • These layers can either be
    • completely interconnected
    • or pooled.

Before passing the result to the next layer,

  • the convolutional layer
    • uses a convolutional operation on the input.
  • Due to this convolutional operation,
    • the network can be much deeper
    • but with much fewer parameters.

Due to this ability, convolutional neural networks show very effective results

  • in image and video recognition,
  • natural language processing,
  • and recommender systems.

Convolutional neural networks also show great results

  • in semantic parsing and paraphrase detection.

They are also applied in

  • signal processing
  • and image classification.

CNNs are also being used in image analysis and recognition in agriculture

  • where weather features are extracted from satellites
    • like LSAT
  • to predict the growth and yield of a piece of land.

Here’s an image of what a Convolutional Neural Network looks like.

Convolutional Neural Network

Figure 6. Convolutional Neural Network

Our ConvNet used for Image Machine Learning of PV Cell Degradation

Figure 6b. Our ConvNet used for Image Machine Learning of PV Cell Degradation

Time series gif of PV module degradation Electroluminesent Images

Figure 6c. Time series gif of PV module degradation Electroluminesent Images

From our paper

Recurrent Neural Network(RNN) – Long Short Term Memory
  • A Recurrent Neural Network is a type of artificial neural network

    • in which the output of a particular layer
      • is saved
      • and fed back to the input.
    • This helps predict the outcome of the layer.

The first layer is formed in the same way

  • as it is in the feedforward network.
  • That is, with the product of
    • the sum of the weights and features.
  • However, in subsequent layers,
    • the recurrent neural network process begins.

From each time-step to the next,

  • each node will remember some information
    • that it had in the previous time-step.
  • In other words, each node acts as a memory cell
    • while computing and carrying out operations.
  • The neural network begins with the front propagation as usual
    • but remembers the information it may need to use later.

If the prediction is wrong,

  • the system self-learns and works towards making
    • the right prediction during the backpropagation.

This type of neural network is very effective in

  • text-to-speech conversion technology.

Here’s what a recurrent neural network looks like.

Recurrent Neural Network(RNN) – Long Short Term Memory

Figure 7. Recurrent Neural Network(RNN) – Long Short Term Memory

Modular Neural Network
  • A modular neural network

    • has a number of different networks
      • that function independently and perform sub-tasks.
    • The different networks do not really interact with or signal each other
      • during the computation process.
    • They work independently towards achieving the output.

As a result, a large and complex computational process

  • can be done significantly faster
    • by breaking it down into independent components.
  • The computation speed increases
    • because the networks are not interacting with
    • or even connected to each other.

Here’s a visual representation of a Modular Neural Network.

Modular Neural Network

Figure 8. Modular Neural Network

Sequence-To-Sequence Models
  • A sequence to sequence model

    • consists of two recurrent neural networks.
    • There’s an encoder that
      • processes the input
      • and a decoder that processes the output.
    • The encoder and decoder can either
      • use the same parameters
      • or different parameters.
    • This model is particularly applicable
      • in those cases where the length of the input data
      • is not the same as the length of the output data.

Sequence-to-sequence models are applied mainly in

  • chatbots,
  • machine translation, and
  • question answering systems.
Summary
  • There are many types of artificial neural networks

    • that operate in different ways to achieve different outcomes.

The most important part about neural networks is that

  • they are designed in a way that is similar to how neurons in the brain work.

As a result, they are designed

  • to learn more and improve more
  • with more data and more usage.

Unlike traditional machine learning algorithms

  • which tend to stagnate after a certain point,
  • neural networks have the ability to truly grow
    • with more data and more usage.

That’s why many experts believe that different types of neural networks

  • will be the fundamental framework on which
  • next-generation Artificial Intelligence will be built.

Cites

Geoffrey Hinton
  • Learning Representations by Back-propogating Errors [@rumelhartLearningRepresentationsBackpropagating1986]
    • Visualizing Data using t-SNE [@maatenVisualizingDataUsing2008]
  • Deep Learning (review) [@lecunDeepLearning2015]
  • ImageNet Classification with Deep Convolutional Neural Networks [@krizhevskyImageNetClassificationDeep2012a]
  • ImageNet Classification with Deep Convolutional Neural Networks (ACM letter) [@krizhevskyImageNetClassificationDeep2017]
Blogs

References

LS0tDQp0aXRsZTogIkRTQ0kzNTMtMzUzbS00NTM6IENsYXNzIDExYS1wLU5OIFR5cGVzIEZGTk4tUkJGTk4tTUxQLUNOTi1STk5fTFNUTSINCnN1YnRpdGxlOiAiUHJvZnM6IFIuIEguIEZyZW5jaCwgTC4gUy4gQnJ1Y2ttYW4sIFAuIExldSwgSy4gRGF2aXMsIFMuIENpcmxvcyINCmF1dGhvcjogIlRBczogVy4gT2x0amVuLCBLLiBIZXJuYW5kZXosIE0uIExpLCBNLiBMaSwgRC4gQ29sdmluIiANCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiAuLi9sYWIuY3NzDQogICAgaGlnaGxpZ2h0OiBweWdtZW50cw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KICAgIHRvYzogVFJVRQ0KICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQ0KICAgIHRvY19kZXB0aDogNg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCnVybGNvbG9yOiBibHVlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KaGVhZGVyLWluY2x1ZGVzOg0KICBcdXNlcGFja2FnZXtwbGFjZWluc30NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjYWNoZSA9IEZBTFNFLCAjIGlmIFRSVUUga25pdHIgd2lsbCBjYWNoZSByZXN1bHRzIHRvIHJldXNlIGluIGZ1dHVyZSBrbml0cw0KICBmaWcud2lkdGggPSA2LCAjIHRoZSB3aWR0aCBmb3IgcGxvdHMgY3JlYXRlZCBieSBjb2RlIGNodW5rDQogIGZpZy5oZWlnaHQgPSA0LCAjIHRoZSBoZWlnaHQgZm9yIHBsb3RzIGNyZWF0ZWQgYnkgY29kZSBjaHVuaw0KICBmaWcuYWxpZ24gPSAnY2VudGVyJywgIyBob3cgdG8gYWxpZ24gZ3JhcGhpY3MuICdsZWZ0JywgJ3JpZ2h0JywgJ2NlbnRlcicNCiAgZHBpID0gMzAwLCANCiAgZGV2ID0gJ3BuZycsICMgTWFrZXMgZWFjaCBmaWcgYSBwbmcsIGFuZCBhdm9pZHMgcGxvdHRpbmcgZXZlcnkgZGF0YSBwb2ludA0KICAjIG9wdGlvbnModGlueXRleC52ZXJib3NlID0gVFJVRSkNCiAgIyBldmFsID0gRkFMU0UsICMgaWYgRkFMU0UsIHRoZW4gdGhlIFIgY29kZSBjaHVua3MgYXJlIG5vdCBldmFsdWF0ZWQNCiAgIyByZXN1bHRzID0gJ2FzaXMnLCAjIGtuaXRyIHBhc3NlcyB0aHJvdWdoIHJlc3VsdHMgd2l0aG91dCByZWZvcm1hdHRpbmcNCiAgZWNobyA9IFRSVUUsICMgaWYgRkFMU0Uga25pdHIgd29uJ3QgZGlzcGxheSBjb2RlIGluIGNodW5rIGFib3ZlIGl0J3MgcmVzdWx0cw0KICBtZXNzYWdlID0gVFJVRSwgIyBpZiBGQUxTRSBrbml0ciB3b24ndCBkaXNwbGF5IG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBjb2RlDQogIHN0cmlwLndoaXRlID0gVFJVRSwgIyBpZiBGQUxTRSBrbml0ciB3b24ndCByZW1vdmUgd2hpdGUgc3BhY2VzIGF0IGJlZyBvciBlbmQgb2YgY29kZSBjaHVuaw0KICB3YXJuaW5nID0gVFJVRSwgIyBpZiBGQUxTRSBrbml0ciB3b24ndCBkaXNwbGF5IHdhcm5pbmcgbWVzc2FnZXMgaW4gdGhlIGRvYw0KICBlcnJvciA9IFRSVUUpICMgcmVwb3J0IGVycm9ycw0KYGBgDQoNCiBcc2V0Y291bnRlcntzZWN0aW9ufXsxMX0NCiBcc2V0Y291bnRlcntzdWJzZWN0aW9ufXsxfQ0KIFxzZXRjb3VudGVye3N1YnN1YnNlY3Rpb259ezJ9DQogDQojIyMjIENsYXNzIFJlYWRpbmdzLCBBc3NpZ25tZW50cywgU3lsbGFidXMgVG9waWNzDQoNCiMjIyMjIFJlYWRpbmcsIExhYiBFeGVyY2lzZXMsIFNlbVByb2plY3RzDQoNCiAgLSBSZWFkaW5nczogDQogICAgLSBGb3IgdG9kYXk6IA0KICAgIC0gRm9yIG5leHQgY2xhc3M6IExlQ3VuIERlZXAgTGVhcm5pbmcgMjAxNSBSZXZpZXcNCiAgICAtIE5leHQgaXM6ICANCiAgLSBMYWJvcmF0b3J5IEV4ZXJjaXNlczogDQogICAgLSBMRSBwb3N0ZWQNCiAgICAtICoqTEU2IGlzIGR1ZSB0aGlzIGNvbWluZyBUaHVyc2RheSBBcHJpbCAxM3RoKioNCiAgLSBPZmZpY2UgSG91cnM6IChDbGFzcyBDYW52YXMgQ2FsZW5kYXIgZm9yIFpvb20gTGluaykNCiAgICAtIFdlZG5lc2RheXMgQCA0OjAwIFBNIHRvIDU6MDAgUE0gIA0KICAgIC0gU2F0dXJkYXlzIEAgMzowMCBQTSB0byA0OjAwIFBNDQogICAgLSAqKk9mZmljZSBIb3VycyBhcmUgb24gWm9vbSwgYW5kIHJlY29yZGVkKioNCiAgLSBTZW1lc3RlciBQcm9qZWN0cw0KICAgIC0gT2ZmaWNlIEhvdXJzIGZvciBTZW1Qcm9qczogTW9uZGF5cyBhdCA0cG0gb24gWm9vbQ0KICAgIC0gRFNDSSA0NTMgU3R1ZGVudHMgQml3ZWVrbHkgVXBkYXRlcyBEdWUgDQogICAgICAtIFVwZGF0ZSAjIGlzIER1ZSAqKiAgKioNCiAgICAtIERTQ0kgNDUzIFN0dWRlbnRzIA0KICAgICAgLSBOZXh0IFJlcG9ydCBPdXQgIyBpcyBEdWUgIA0KICAgIC0gQWxsIERTQ0kgMzUzLzM1M00vNDUzLCBFMTQ1My8yNDUzIFN0dWRlbnRzOiANCiAgICAgIC0gKipQZWVyIEdyYWRpbmcgb2YgUmVwb3J0IE91dCAgaXMgRHVlIEZyaWRheSAqKg0KICAtIEV4YW1zDQogICAgLSBGaW5hbDogVHVlc2RheSBNYXkgMTF0aCAyMDIxLCAxMjowMCBQTSB0byAzIFBNDQogICAgDQoNCg0KICAgIA0KIyMjIyBTeWxsYWJ1cw0KDQohW0lUIEZ1bmRhbWVudGFsczogQXBwbGllZCBEYXRhIFNjaWVuY2Ugd2l0aCBSLCBTeWxsYWJ1c10oLi9maWdzL3N5bGxhYnVzLnBuZykNCg0KXEZsb2F0QmFycmllcg0KDQoNCiMjIyMgVGhlIHJlY2lwaWVudHMgb2YgdGhlIDIwMTkgVHVyaW5nIEF3YXJkIG9mIEFDTQ0KDQogIC0gW0Fzc29jaWF0aW9uIGZvciBDb21wdXRpbmcgTWFjaGluZXJ5XSh3d3cuYWNtLm9yZykNCg0KR2VvZmZyZXkgSGludG9uLCBZYW5uIExlY3VuIGFuZCBZb3NodWEgQmVuZ2lvIA0KDQogIC0gW0dlb2ZmcmV5IEhpbnRvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR2VvZmZyZXlfSGludG9uKQ0KICAgIC0gKipCYWNrcHJvcGFnYXRpb24qKjogSW4gYSAxOTg2IHBhcGVyLCDigJxMZWFybmluZyBJbnRlcm5hbCBSZXByZXNlbnRhdGlvbnMgYnkgRXJyb3IgUHJvcGFnYXRpb24s4oCdIGNvLWF1dGhvcmVkIHdpdGggRGF2aWQgUnVtZWxoYXJ0IGFuZCBSb25hbGQgV2lsbGlhbXMsIEhpbnRvbiBkZW1vbnN0cmF0ZWQgdGhhdCB0aGUgYmFja3Byb3BhZ2F0aW9uIGFsZ29yaXRobSBhbGxvd2VkIG5ldXJhbCBuZXRzIHRvIGRpc2NvdmVyIHRoZWlyIG93biBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHVzZSBuZXVyYWwgbmV0cyB0byBzb2x2ZSBwcm9ibGVtcyB0aGF0IGhhZCBwcmV2aW91c2x5IGJlZW4gdGhvdWdodCB0byBiZSBiZXlvbmQgdGhlaXIgcmVhY2guIFRoZSBiYWNrcHJvcGFnYXRpb24gYWxnb3JpdGhtIGlzIHN0YW5kYXJkIGluIG1vc3QgbmV1cmFsIG5ldHdvcmtzIHRvZGF5Lg0KICAgIC0gKipCb2x0em1hbm4gTWFjaGluZXMqKjogSW4gMTk4Mywgd2l0aCBUZXJyZW5jZSBTZWpub3dza2ksIEhpbnRvbiBpbnZlbnRlZCBCb2x0em1hbm4gTWFjaGluZXMsIG9uZSBvZiB0aGUgZmlyc3QgbmV1cmFsIG5ldHdvcmtzIGNhcGFibGUgb2YgbGVhcm5pbmcgaW50ZXJuYWwgcmVwcmVzZW50YXRpb25zIGluIG5ldXJvbnMgdGhhdCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBpbnB1dCBvciBvdXRwdXQuDQogICAgLSAqKkltcHJvdmVtZW50cyB0byBjb252b2x1dGlvbmFsIG5ldXJhbCBuZXR3b3JrcyoqOiBJbiAyMDEyLCB3aXRoIGhpcyBzdHVkZW50cywgQWxleCBLcml6aGV2c2t5IGFuZCBJbHlhIFN1dHNrZXZlciwgSGludG9uIGltcHJvdmVkIGNvbnZvbHV0aW9uYWwgbmV1cmFsIG5ldHdvcmtzIHVzaW5nIHJlY3RpZmllZCBsaW5lYXIgbmV1cm9ucyBhbmQgZHJvcG91dCByZWd1bGFyaXphdGlvbi4gSW4gdGhlIHByb21pbmVudCBJbWFnZU5ldCBjb21wZXRpdGlvbiwgSGludG9uIGFuZCBoaXMgc3R1ZGVudHMgYWxtb3N0IGhhbHZlZCB0aGUgZXJyb3IgcmF0ZSBmb3Igb2JqZWN0IHJlY29nbml0aW9uIGFuZCByZXNoYXBlZCB0aGUgY29tcHV0ZXIgdmlzaW9uIGZpZWxkLg0KICAtIFtZYW5uIExlY3VuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZYW5uX0xlQ3VuKQ0KICAgIC0gKipDb252b2x1dGlvbmFsIG5ldXJhbCBuZXR3b3JrcyoqOiBJbiB0aGUgMTk4MHMsIExlQ3VuIGRldmVsb3BlZCBjb252b2x1dGlvbmFsIG5ldXJhbCBuZXR3b3JrcywgYSBmb3VuZGF0aW9uYWwgcHJpbmNpcGxlIGluIHRoZSBmaWVsZCwgd2hpY2gsIGFtb25nIG90aGVyIGFkdmFudGFnZXMsIGhhdmUgYmVlbiBlc3NlbnRpYWwgaW4gbWFraW5nIGRlZXAgbGVhcm5pbmcgbW9yZSBlZmZpY2llbnQuIEluIHRoZSBsYXRlIDE5ODBzLCB3aGlsZSB3b3JraW5nIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFRvcm9udG8gYW5kIEJlbGwgTGFicywgTGVDdW4gd2FzIHRoZSBmaXJzdCB0byB0cmFpbiBhIGNvbnZvbHV0aW9uYWwgbmV1cmFsIG5ldHdvcmsgc3lzdGVtIG9uIGltYWdlcyBvZiBoYW5kd3JpdHRlbiBkaWdpdHMuIFRvZGF5LCBjb252b2x1dGlvbmFsIG5ldXJhbCBuZXR3b3JrcyBhcmUgYW4gaW5kdXN0cnkgc3RhbmRhcmQgaW4gY29tcHV0ZXIgdmlzaW9uLCBhcyB3ZWxsIGFzIGluIHNwZWVjaCByZWNvZ25pdGlvbiwgc3BlZWNoIHN5bnRoZXNpcywgaW1hZ2Ugc3ludGhlc2lzLCBhbmQgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nLiBUaGV5IGFyZSB1c2VkIGluIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucywgaW5jbHVkaW5nIGF1dG9ub21vdXMgZHJpdmluZywgbWVkaWNhbCBpbWFnZSBhbmFseXNpcywgdm9pY2UtYWN0aXZhdGVkIGFzc2lzdGFudHMsIGFuZCBpbmZvcm1hdGlvbiBmaWx0ZXJpbmcuDQogICAgLSAqKkltcHJvdmluZyBiYWNrcHJvcGFnYXRpb24gYWxnb3JpdGhtcyoqOiBMZUN1biBwcm9wb3NlZCBhbiBlYXJseSB2ZXJzaW9uIG9mIHRoZSBiYWNrcHJvcGFnYXRpb24gYWxnb3JpdGhtIChiYWNrcHJvcCksIGFuZCBnYXZlIGEgY2xlYW4gZGVyaXZhdGlvbiBvZiBpdCBiYXNlZCBvbiB2YXJpYXRpb25hbCBwcmluY2lwbGVzLiBIaXMgd29yayB0byBzcGVlZCB1cCBiYWNrcHJvcGFnYXRpb24gYWxnb3JpdGhtcyBpbmNsdWRlZCBkZXNjcmliaW5nIHR3byBzaW1wbGUgbWV0aG9kcyB0byBhY2NlbGVyYXRlIGxlYXJuaW5nIHRpbWUuDQogICAgLSAqKkJyb2FkZW5pbmcgdGhlIHZpc2lvbiBvZiBuZXVyYWwgbmV0d29ya3MqKjogTGVDdW4gaXMgYWxzbyBjcmVkaXRlZCB3aXRoIGRldmVsb3BpbmcgYSBicm9hZGVyIHZpc2lvbiBmb3IgbmV1cmFsIG5ldHdvcmtzIGFzIGEgY29tcHV0YXRpb25hbCBtb2RlbCBmb3IgYSB3aWRlIHJhbmdlIG9mIHRhc2tzLCBpbnRyb2R1Y2luZyBpbiBlYXJseSB3b3JrIGEgbnVtYmVyIG9mIGNvbmNlcHRzIG5vdyBmdW5kYW1lbnRhbCBpbiBBSS4gRm9yIGV4YW1wbGUsIGluIHRoZSBjb250ZXh0IG9mIHJlY29nbml6aW5nIGltYWdlcywgaGUgc3R1ZGllZCBob3cgaGllcmFyY2hpY2FsIGZlYXR1cmUgcmVwcmVzZW50YXRpb24gY2FuIGJlIGxlYXJuZWQgaW4gbmV1cmFsIG5ldHdvcmtz4oCUYSBjb25jZXB0IHRoYXQgaXMgbm93IHJvdXRpbmVseSB1c2VkIGluIG1hbnkgcmVjb2duaXRpb24gdGFza3MuIFRvZ2V0aGVyIHdpdGggTMOpb24gQm90dG91LCBoZSBwcm9wb3NlZCB0aGUgaWRlYSwgdXNlZCBpbiBldmVyeSBtb2Rlcm4gZGVlcCBsZWFybmluZyBzb2Z0d2FyZSwgdGhhdCBsZWFybmluZyBzeXN0ZW1zIGNhbiBiZSBidWlsdCBhcyBjb21wbGV4IG5ldHdvcmtzIG9mIG1vZHVsZXMgd2hlcmUgYmFja3Byb3BhZ2F0aW9uIGlzIHBlcmZvcm1lZCB0aHJvdWdoIGF1dG9tYXRpYyBkaWZmZXJlbnRpYXRpb24uIFRoZXkgYWxzbyBwcm9wb3NlZCBkZWVwIGxlYXJuaW5nIGFyY2hpdGVjdHVyZXMgdGhhdCBjYW4gbWFuaXB1bGF0ZSBzdHJ1Y3R1cmVkIGRhdGEsIHN1Y2ggYXMgZ3JhcGhzLg0KICAtIFtZb3NodWEgQmVuZ2lvXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Zb3NodWFfQmVuZ2lvKQ0KICAgIC0gKipQcm9iYWJpbGlzdGljIG1vZGVscyBvZiBzZXF1ZW5jZXMqKjogSW4gdGhlIDE5OTBzLCBCZW5naW8gY29tYmluZWQgbmV1cmFsIG5ldHdvcmtzIHdpdGggcHJvYmFiaWxpc3RpYyBtb2RlbHMgb2Ygc2VxdWVuY2VzLCBzdWNoIGFzIGhpZGRlbiBNYXJrb3YgbW9kZWxzLiBUaGVzZSBpZGVhcyB3ZXJlIGluY29ycG9yYXRlZCBpbnRvIGEgc3lzdGVtIHVzZWQgYnkgQVQmVC9OQ1IgZm9yIHJlYWRpbmcgaGFuZHdyaXR0ZW4gY2hlY2tzLCB3ZXJlIGNvbnNpZGVyZWQgYSBwaW5uYWNsZSBvZiBuZXVyYWwgbmV0d29yayByZXNlYXJjaCBpbiB0aGUgMTk5MHMsIGFuZCBtb2Rlcm4gZGVlcCBsZWFybmluZyBzcGVlY2ggcmVjb2duaXRpb24gc3lzdGVtcyBhcmUgZXh0ZW5kaW5nIHRoZXNlIGNvbmNlcHRzLg0KICAgIC0gKipIaWdoLWRpbWVuc2lvbmFsIHdvcmQgZW1iZWRkaW5ncyBhbmQgYXR0ZW50aW9uKio6IEluIDIwMDAsIEJlbmdpbyBhdXRob3JlZCB0aGUgbGFuZG1hcmsgcGFwZXIsIOKAnEEgTmV1cmFsIFByb2JhYmlsaXN0aWMgTGFuZ3VhZ2UgTW9kZWws4oCdIHRoYXQgaW50cm9kdWNlZCBoaWdoLWRpbWVuc2lvbiB3b3JkIGVtYmVkZGluZ3MgYXMgYSByZXByZXNlbnRhdGlvbiBvZiB3b3JkIG1lYW5pbmcuIEJlbmdpb+KAmXMgaW5zaWdodHMgaGFkIGEgaHVnZSBhbmQgbGFzdGluZyBpbXBhY3Qgb24gbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIHRhc2tzIGluY2x1ZGluZyBsYW5ndWFnZSB0cmFuc2xhdGlvbiwgcXVlc3Rpb24gYW5zd2VyaW5nLCBhbmQgdmlzdWFsIHF1ZXN0aW9uIGFuc3dlcmluZy4gSGlzIGdyb3VwIGFsc28gaW50cm9kdWNlZCBhIGZvcm0gb2YgYXR0ZW50aW9uIG1lY2hhbmlzbSB3aGljaCBsZWQgdG8gYnJlYWt0aHJvdWdocyBpbiBtYWNoaW5lIHRyYW5zbGF0aW9uIGFuZCBmb3JtIGEga2V5IGNvbXBvbmVudCBvZiBzZXF1ZW50aWFsIHByb2Nlc3Npbmcgd2l0aCBkZWVwIGxlYXJuaW5nLg0KICAgIC0gKipHZW5lcmF0aXZlIGFkdmVyc2FyaWFsIG5ldHdvcmtzKio6IFNpbmNlIDIwMTAsIEJlbmdpb+KAmXMgcGFwZXJzIG9uIGdlbmVyYXRpdmUgZGVlcCBsZWFybmluZywgaW4gcGFydGljdWxhciB0aGUgR2VuZXJhdGl2ZSBBZHZlcnNhcmlhbCBOZXR3b3JrcyAoR0FOcykgZGV2ZWxvcGVkIHdpdGggSWFuIEdvb2RmZWxsb3csIGhhdmUgc3Bhd25lZCBhIHJldm9sdXRpb24gaW4gY29tcHV0ZXIgdmlzaW9uIGFuZCBjb21wdXRlciBncmFwaGljcy4gSW4gb25lIGZhc2NpbmF0aW5nIGFwcGxpY2F0aW9uIG9mIHRoaXMgd29yaywgY29tcHV0ZXJzIGNhbiBhY3R1YWxseSBjcmVhdGUgb3JpZ2luYWwgaW1hZ2VzLCByZW1pbmlzY2VudCBvZiB0aGUgY3JlYXRpdml0eSB0aGF0IGlzIGNvbnNpZGVyZWQgYSBoYWxsbWFyayBvZiBodW1hbiBpbnRlbGxpZ2VuY2UuDQogICAgDQojIyMjIyBIaW50b24gYW5kIExlQ3VuJ3MgVHVyaW5nIEF3YXJkIExlY3R1cmUgcmVjb3JkaW5ncw0KDQogIC0gW0FDTSB5b3V0dWJlXShodHRwczovL2ZjcmMuYWNtLm9yZy90dXJpbmctbGVjdHVyZS1hdC1mY3JjLTIwMTkpDQogICAgICANCiMjIyMgVHlwZXMgb2YgTmV1cmFsIE5ldHdvcmtzDQoNCi0gTXVjaCBvZiBtb2Rlcm4gdGVjaG5vbG9neSBpcyBiYXNlZCBvbiBjb21wdXRhdGlvbmFsIG1vZGVscyANCg0KICAtIGtub3duIGFzIGFydGlmaWNpYWwgbmV1cmFsIG5ldHdvcmtzLiANCiAgDQpUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgbmV1cmFsIG5ldHdvcmtzIA0KDQogIC0gd2hpY2ggZnVuY3Rpb24gb24gdGhlIHNhbWUgcHJpbmNpcGxlcyANCiAgLSBhcyB0aGUgbmVydm91cyBzeXN0ZW0gaW4gdGhlIGh1bWFuIGJvZHkuDQoNCkFzIFtIb3dhcmQgUmhlaW5nb2xkXShodHRwczovL3JoZWluZ29sZC5jb20vKSBzYWlkLCANCg0KYGBgDQrigJxUaGUgbmV1cmFsIG5ldHdvcmsgaXMgdGhpcyBraW5kIG9mIHRlY2hub2xvZ3kgdGhhdCBpcyBub3QgYW4gYWxnb3JpdGhtLCANCml0IGlzIGEgbmV0d29yayB0aGF0IGhhcyB3ZWlnaHRzIG9uIGl0LCANCmFuZCB5b3UgY2FuIGFkanVzdCB0aGUgd2VpZ2h0cyBzbyB0aGF0IGl0IGxlYXJucy4gDQpZb3UgdGVhY2ggaXQgdGhyb3VnaCB0cmlhbHMu4oCdDQpgYGANCg0KIyMjIyMgV2hhdCBhcmUgQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3M/DQoNCi0gQW4gYXJ0aWZpY2lhbCBuZXVyYWwgbmV0d29yayBpcyBhIHN5c3RlbSBvZiBoYXJkd2FyZSBvciBzb2Z0d2FyZSANCg0KICAtIHRoYXQgaXMgcGF0dGVybmVkIGFmdGVyIHRoZSB3b3JraW5nIG9mIG5ldXJvbnMgDQogICAgLSBpbiB0aGUgaHVtYW4gYnJhaW4gYW5kIG5lcnZvdXMgc3lzdGVtLiANCg0KQXJ0aWZpY2lhbCBuZXVyYWwgbmV0d29ya3MgYXJlIA0KDQogIC0gYSB2YXJpZXR5IG9mIGRlZXAgbGVhcm5pbmcgdGVjaG5vbG9neSANCiAgLSB3aGljaCBjb21lcyB1bmRlciB0aGUgYnJvYWQgZG9tYWluIA0KICAgIC0gb2YgQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UuDQoNCkRlZXAgbGVhcm5pbmcgaXMgYSBicmFuY2ggb2YgTWFjaGluZSBMZWFybmluZyANCg0KICAtIHdoaWNoIHVzZXMgZGlmZmVyZW50IHR5cGVzIG9mIG5ldXJhbCBuZXR3b3Jrcy4gDQogIA0KVGhlc2UgYWxnb3JpdGhtcyBhcmUgaW5zcGlyZWQgYnkgdGhlIHdheSBvdXIgYnJhaW4gZnVuY3Rpb25zIA0KDQogIC0gYW5kIHRoZXJlZm9yZSBtYW55IGV4cGVydHMgYmVsaWV2ZSB0aGV5IGFyZSBvdXIgYmVzdCBzaG90IA0KICAtIHRvIG1vdmluZyB0b3dhcmRzIHJlYWwgQUkgKEFydGlmaWNpYWwgSW50ZWxsaWdlbmNlKS4NCg0KRGVlcCBsZWFybmluZyBpcyBiZWNvbWluZyBlc3BlY2lhbGx5IGV4Y2l0aW5nIG5vdyANCg0KICAtIGFzIHdlIGhhdmUgbW9yZSBhbW91bnRzIG9mIGRhdGEgDQogIC0gYW5kIGxhcmdlciBuZXVyYWwgbmV0d29ya3MgdG8gd29yayB3aXRoLg0KDQpNb3Jlb3ZlciwgdGhlIHBlcmZvcm1hbmNlIG9mIG5ldXJhbCBuZXR3b3JrcyANCg0KICAtIGltcHJvdmVzIGFzIHRoZXkgZ3JvdyBiaWdnZXIgYW5kIHdvcmsgd2l0aCBtb3JlIGFuZCBtb3JlIGRhdGEsIA0KICAtIHVubGlrZSBvdGhlciBNYWNoaW5lIExlYXJuaW5nIGFsZ29yaXRobXMgDQogICAgLSB3aGljaCBjYW4gcmVhY2ggYSBwbGF0ZWF1IGFmdGVyIGEgcG9pbnQuDQoNCiFbRmlndXJlIDEuIEEgbW9zdGx5IGNvbXBsZXRlIGNoYXJ0IG9mIE5ldXJhbCBOZXR3b3Jrc10oLi9maWdzL1R5cGVOTi0xLW5ldXJhbG5ldHdvcmtzLnBuZykNCg0KRmlndXJlIDEuIEEgbW9zdGx5IGNvbXBsZXRlIGNoYXJ0IG9mIE5ldXJhbCBOZXR3b3Jrcw0KDQojIyMjIyBIb3cgZG8gTmV1cmFsIE5ldHdvcmtzIHdvcms/DQoNCi0gQSBuZXVyYWwgbmV0d29yayBoYXMgYSBsYXJnZSBudW1iZXIgb2Ygbm9kZXMuIA0KDQogIC0gVGhlc2Ugbm9kZXMgKG9yIHByb2Nlc3NvcnMpIG9wZXJhdGUgcGFyYWxsZWxseSANCiAgICAtIGJ1dCBhcmUgYXJyYW5nZWQgYXMgbGF5ZXJzLiANCiAgLSBUaGUgZmlyc3QgbGF5ZXIgcmVjZWl2ZXMgdGhlIHJhdyBpbnB1dCANCiAgICAtIHNpbWlsYXIgdG8gaG93IHRoZSBvcHRpYyBuZXJ2ZSANCiAgICAtIHJlY2VpdmVzIHRoZSByYXcgaW5mb3JtYXRpb24gaW4gaHVtYW4gYmVpbmdzLg0KDQpFYWNoIHN1Y2Nlc3NpdmUgbGF5ZXIgdGhlbiByZWNlaXZlcyBpbnB1dCANCg0KICAtIGZyb20gdGhlIGxheWVyIGJlZm9yZSBpdCANCiAgICAtIGFuZCB0aGVuIHBhc3NlcyBvbiBpdHMgb3V0cHV0IHRvIHRoZSBsYXllciBhZnRlciBpdC4gDQogIC0gVGhlIGxhc3QgbGF5ZXIgcHJvY2Vzc2VzIHRoZSBmaW5hbCBvdXRwdXQuDQoNCk5vZGVzIG1ha2UgdXAgZWFjaCB0aWVyLiANCg0KICAtIFRoZSBub2RlcyBhcmUgaGlnaGx5IGludGVyY29ubmVjdGVkIA0KICAgIC0gd2l0aCB0aGUgbm9kZXMgaW4gdGhlIHRpZXIgYmVmb3JlIGFuZCBhZnRlci4gDQogIC0gRWFjaCBub2RlIGluIHRoZSBuZXVyYWwgbmV0d29yayBoYXMgaXRzIG93biBzcGhlcmUgb2Yga25vd2xlZGdlLCANCiAgICAtIGluY2x1ZGluZyBydWxlcyB0aGF0IGl0IHdhcyBwcm9ncmFtbWVkIHdpdGggDQogICAgLSBhbmQgcnVsZXMgaXQgaGFzIGxlYXJudCBieSBpdHNlbGYuICANCg0KVGhlIGtleSB0byB0aGUgZWZmaWNhY3kgb2YgbmV1cmFsIG5ldHdvcmtzIA0KDQogIC0gaXMgdGhleSBhcmUgZXh0cmVtZWx5IGFkYXB0aXZlIGFuZCBsZWFybiB2ZXJ5IHF1aWNrbHkuIA0KICAtIEVhY2ggbm9kZSB3ZWlnaHMgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIGlucHV0IA0KICAgIC0gaXQgcmVjZWl2ZXMgZnJvbSB0aGUgbm9kZXMgYmVmb3JlIGl0LiANCiAgLSBUaGUgaW5wdXRzIHRoYXQgY29udHJpYnV0ZSB0aGUgbW9zdCB0b3dhcmRzIHRoZSByaWdodCBvdXRwdXQgDQogICAgLSBhcmUgZ2l2ZW4gdGhlIGhpZ2hlc3Qgd2VpZ2h0Lg0KDQojIyMjIyBXaGF0IGFyZSB0aGUgRGlmZmVyZW50IFR5cGVzIG9mIE5ldXJhbCBOZXR3b3Jrcz8NCg0KLSBEaWZmZXJlbnQgdHlwZXMgb2YgbmV1cmFsIG5ldHdvcmtzIA0KDQogIC0gdXNlIGRpZmZlcmVudCBwcmluY2lwbGVzIA0KICAgIC0gaW4gZGV0ZXJtaW5pbmcgdGhlaXIgb3duIHJ1bGVzLiANCg0KVGhlcmUgYXJlIG1hbnkgdHlwZXMgb2YgYXJ0aWZpY2lhbCBuZXVyYWwgbmV0d29ya3MsIGVhY2ggd2l0aCB0aGVpciB1bmlxdWUgc3RyZW5ndGhzLiANCg0KVGhpcyBIaW50b24gdmlkZW8gZGlzY3Vzc2VzIHRoZSANCg0KICAtIGRpZmZlcmVudCB0eXBlcyBvZiBuZXVyYWwgbmV0d29ya3MgDQogIC0gYW5kIHRoZWlyIGFwcGxpY2F0aW9ucyBpbiBkZXRhaWwuDQoNCltOZXVyYWwgTmV0d29ya3MgZm9yIE1hY2hpbmUgTGVhcm5pbmcsIENsYXNzIDJhLCBHZW9mZnJleSBIaW50b25dKGh0dHBzOi8veW91dHUuYmUvbDBmb0I5bVVyYzQpDQoNCiFbQ2xhc3MgMmE6QW4gb3ZlcnZpZXcgb2YgdGhlIG1haW4gdHlwZXMgb2YgbmV1cmFsIG5ldHdvcmtzXSguL2ZpZ3MvVHlwZU5OLTItSGludG9uTGVjdHVyZTJhLnBuZykNCg0KRmlndXJlIDIuIEdlb2ZmcmV5IEhpbnRvbiBvbiBUeXBlcyBvZiBOZXVyYWwgTmV0d29ya3MNCg0KIyMjIyMgR2VvZmZyZXkgSGludG9uIA0KDQotIEhlIGhhcyBkZXZlbG9wZWQgbWFueSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgYWR2YW5jZXMgaW4gbWFjaGluZSBsZWFybmluZy4NCg0KVGhlc2UgcGFwZXJzIGFyZSBpbiB5b3VyIDMtcmVhZGluZ3MgLyAyLWFydGljbGVzDQoNCiAgLSBCYWNrcHJvcGFnYXRpb24gW0BydW1lbGhhcnRMZWFybmluZ1JlcHJlc2VudGF0aW9uc0JhY2twcm9wYWdhdGluZzE5ODZdDQogIC0gdC1TTkUgZm9yIGRhdGEgdmlzdWFsaXphdGlvbiBbQG1hYXRlblZpc3VhbGl6aW5nRGF0YVVzaW5nMjAwOF0NCiAgLSBEZWVwIE5OcyBmb3IgSW1hZ2VOZXQgSW1hZ2UgQ2xhc3NpZmljYXRpb24gW0Brcml6aGV2c2t5SW1hZ2VOZXRDbGFzc2lmaWNhdGlvbkRlZXAyMDEyYSxAa3JpemhldnNreUltYWdlTmV0Q2xhc3NpZmljYXRpb25EZWVwMjAxN10NCiAgLSBEZWVwIExlYXJuaW5nIFtAbGVjdW5EZWVwTGVhcm5pbmcyMDE1XQ0KICAtIEhpcyBbKipOZXVyYWwgTmV0d29ya3MgZm9yIE1hY2hpbmUgTGVhcm5pbmcqKiBjbGFzcyB2aWRlb3MgcGxheWxpc3RdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9UExvUmwzSHQ0Sk9jZFU4NzJHaGlZV2Y2andya19TTmh6OSkNCg0KIyMjIyBJbXBvcnRhbnQgdHlwZXMgb2YgbmV1cmFsIG5ldHdvcmtzIGFuZCB0aGVpciBhcHBsaWNhdGlvbnMNCg0KLSAjIyMjIyBGZWVkZm9yd2FyZCBOZXVyYWwgTmV0d29yayDigJMgQXJ0aWZpY2lhbCBOZXVyb24NCg0KVGhpcyBpcyBvbmUgb2YgdGhlIHNpbXBsZXN0IHR5cGVzIG9mIGFydGlmaWNpYWwgbmV1cmFsIG5ldHdvcmtzLiANCg0KICAtIEluIGEgZmVlZGZvcndhcmQgbmV1cmFsIG5ldHdvcmssIA0KICAgIC0gdGhlIGRhdGEgcGFzc2VzIHRocm91Z2ggdGhlIGRpZmZlcmVudCBpbnB1dCBub2RlcyANCiAgICAtIHRpbGwgaXQgcmVhY2hlcyB0aGUgb3V0cHV0IG5vZGUuDQoNCkluIG90aGVyIHdvcmRzLCBkYXRhIG1vdmVzIGluIG9ubHkgb25lIGRpcmVjdGlvbiANCg0KICAtIGZyb20gdGhlIGZpcnN0IHRpZXIgb253YXJkcyANCiAgICAtIHVudGlsIGl0IHJlYWNoZXMgdGhlIG91dHB1dCBub2RlLiANCiAgLSBUaGlzIGlzIGFsc28ga25vd24gYXMgYSBmcm9udCBwcm9wYWdhdGVkIHdhdmUgDQogICAgLSB3aGljaCBpcyB1c3VhbGx5IGFjaGlldmVkIA0KICAgIC0gYnkgdXNpbmcgYSBjbGFzc2lmeWluZyBhY3RpdmF0aW9uIGZ1bmN0aW9uLg0KDQpVbmxpa2UgaW4gbW9yZSBjb21wbGV4IHR5cGVzIG9mIG5ldXJhbCBuZXR3b3JrcywgDQoNCiAgLSB0aGVyZSBpcyBubyBiYWNrcHJvcGFnYXRpb24gDQogICAgLSBhbmQgZGF0YSBtb3ZlcyBpbiBvbmUgZGlyZWN0aW9uIG9ubHkuIA0KICAtIEEgZmVlZGZvcndhcmQgbmV1cmFsIG5ldHdvcmsgDQogICAgLSBtYXkgaGF2ZSBhIHNpbmdsZSBsYXllciANCiAgICAtIG9yIGl0IG1heSBoYXZlIGhpZGRlbiBsYXllcnMuDQoNCkluIGEgZmVlZGZvcndhcmQgbmV1cmFsIG5ldHdvcmssIA0KDQogIC0gdGhlIHN1bSBvZiB0aGUgcHJvZHVjdHMgb2YgdGhlIGlucHV0cyBhbmQgdGhlaXIgd2VpZ2h0cyBhcmUgY2FsY3VsYXRlZC4gDQogIC0gVGhpcyBpcyB0aGVuIGZlZCB0byB0aGUgb3V0cHV0LiANCg0KSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgc2luZ2xlIGxheWVyIGZlZWRmb3J3YXJkIG5ldXJhbCBuZXR3b3JrLg0KDQohW0ZlZWRmb3J3YXJkIE5ldXJhbCBOZXR3b3JrIOKAkyBBcnRpZmljaWFsIE5ldXJvbl0oLi9maWdzL1R5cGVOTi0zLUZlZWRGb3J3YWQucG5nKQ0KDQpGaWd1cmUgMy4gRmVlZGZvcndhcmQgTmV1cmFsIE5ldHdvcmsg4oCTIEFydGlmaWNpYWwgTmV1cm9uDQoNCkZlZWRmb3J3YXJkIG5ldXJhbCBuZXR3b3JrcyBhcmUgdXNlZCBpbiB0ZWNobm9sb2dpZXMgbGlrZSANCg0KICAtIEZhY2UgcmVjb2duaXRpb24gYW5kIGNvbXB1dGVyIHZpc2lvbi4gDQogIC0gVGhpcyBpcyBiZWNhdXNlIHRoZSB0YXJnZXQgY2xhc3NlcyBpbiB0aGVzZSBhcHBsaWNhdGlvbnMgDQogICAgLSBhcmUgaGFyZCB0byBjbGFzc2lmeS4NCg0KQSBzaW1wbGUgZmVlZGZvcndhcmQgbmV1cmFsIG5ldHdvcmsgaXMgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIGRhdGEgDQoNCiAgLSB3aGljaCBjb250YWlucyBhIGxvdCBvZiBub2lzZS4gDQogIC0gRmVlZGZvcndhcmQgbmV1cmFsIG5ldHdvcmtzIGFyZSBhbHNvIHJlbGF0aXZlbHkgc2ltcGxlIHRvIG1haW50YWluLg0KDQojIyMjIyBSYWRpYWwgQmFzaXMgRnVuY3Rpb24gTmV1cmFsIE5ldHdvcmsNCg0KLSBBIHJhZGlhbCBiYXNpcyBmdW5jdGlvbiANCg0KICAtIGNvbnNpZGVycyB0aGUgZGlzdGFuY2Ugb2YgYW55IHBvaW50IHJlbGF0aXZlIHRvIHRoZSBjZW50cmUuIA0KDQpTdWNoIG5ldXJhbCBuZXR3b3JrcyBoYXZlIHR3byBsYXllcnMuIA0KDQogIC0gSW4gdGhlIGlubmVyIGxheWVyLCANCiAgICAtIHRoZSBmZWF0dXJlcyBhcmUgY29tYmluZWQgd2l0aCB0aGUgcmFkaWFsIGJhc2lzIGZ1bmN0aW9uLg0KDQpUaGVuIHRoZSBvdXRwdXQgb2YgdGhlc2UgZmVhdHVyZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IA0KDQogIC0gd2hlbiBjYWxjdWxhdGluZyB0aGUgc2FtZSBvdXRwdXQgaW4gdGhlIG5leHQgdGltZS1zdGVwLiANCiAgDQpIZXJlIGlzIGEgZGlhZ3JhbSB3aGljaCByZXByZXNlbnRzIGEgcmFkaWFsIGJhc2lzIGZ1bmN0aW9uIG5ldXJhbCBuZXR3b3JrLg0KDQojICFbUmFkaWFsIEJhc2lzIEZ1bmN0aW9uIE5ldXJhbCBOZXR3b3JrXSguL2ZpZ3MvVHlwZU5OLTQtUkJGTk4uZ2lmKXt3aWR0aD01MCV9DQoNCmBgYHtyIFJCRk5OLCBvdXQud2lkdGggPSAiNDAwcHgiLCBmaWcuY2FwPSJSYWRpYWwgQmFzaXMgRnVuY3Rpb24gTmV1cmFsIE5ldHdvcmsifQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3Nbd2lkdGggPSAwLjhcdGV4dHdpZHRoXSgiLi9maWdzL1R5cGVOTi00LVJCRk5OLmdpZiIpDQpgYGANCg0KRmlndXJlIDQuIFJhZGlhbCBCYXNpcyBGdW5jdGlvbiBOZXVyYWwgTmV0d29yaw0KDQpUaGUgcmFkaWFsIGJhc2lzIGZ1bmN0aW9uIG5ldXJhbCBuZXR3b3JrIGlzIGFwcGxpZWQgZXh0ZW5zaXZlbHkgDQoNCiAgLSBpbiBwb3dlciByZXN0b3JhdGlvbiBzeXN0ZW1zLiANCiAgLSBJbiByZWNlbnQgZGVjYWRlcywgcG93ZXIgc3lzdGVtcyBoYXZlIGJlY29tZSBiaWdnZXIgYW5kIG1vcmUgY29tcGxleC4NCiAgLSBUaGlzIGluY3JlYXNlcyB0aGUgcmlzayBvZiBhIGJsYWNrb3V0LiANCg0KVGhpcyBuZXVyYWwgbmV0d29yayBpcyB1c2VkIGluIHRoZSBwb3dlciByZXN0b3JhdGlvbiBzeXN0ZW1zIA0KDQogIC0gaW4gb3JkZXIgdG8gcmVzdG9yZSBwb3dlciBpbiB0aGUgc2hvcnRlc3QgcG9zc2libGUgdGltZS4NCg0KIyMjIyMgTXVsdGlsYXllciBQZXJjZXB0cm9uDQoNCi0gQSBtdWx0aWxheWVyIHBlcmNlcHRyb24gaGFzIHRocmVlIG9yIG1vcmUgbGF5ZXJzLiANCg0KICAtIEl0IGlzIHVzZWQgdG8gY2xhc3NpZnkgZGF0YSB0aGF0IGNhbm5vdCBiZSBzZXBhcmF0ZWQgbGluZWFybHkuIA0KICAtIEl0IGlzIGEgdHlwZSBvZiBhcnRpZmljaWFsIG5ldXJhbCBuZXR3b3JrIHRoYXQgaXMgKipmdWxseSBjb25uZWN0ZWQqKi4gDQogIC0gVGhpcyBpcyBiZWNhdXNlIGV2ZXJ5IHNpbmdsZSBub2RlIGluIGEgbGF5ZXIgDQogICAgLSBpcyBjb25uZWN0ZWQgdG8gZWFjaCBub2RlIGluIHRoZSBmb2xsb3dpbmcgbGF5ZXIuDQoNCkEgbXVsdGlsYXllciBwZXJjZXB0cm9uIA0KDQogIC0gdXNlcyBhIG5vbmxpbmVhciBhY3RpdmF0aW9uIGZ1bmN0aW9uIA0KICAgIC0gKG1haW5seSBoeXBlcmJvbGljIHRhbmdlbnQgb3IgbG9naXN0aWMgZnVuY3Rpb24pLiANCg0KSGVyZeKAmXMgd2hhdCBhIG11bHRpbGF5ZXIgcGVyY2VwdHJvbiBsb29rcyBsaWtlLg0KDQohW011bHRpbGF5ZXIgUGVyY2VwdHJvbl0oLi9maWdzL1R5cGVOTi01LU11bHRpbGF5ZXJQZXJjZXB0cm9uLnBuZykNCg0KRmlndXJlIDUuIE11bHRpbGF5ZXIgUGVyY2VwdHJvbg0KDQpUaGlzIHR5cGUgb2YgbmV1cmFsIG5ldHdvcmsgaXMgYXBwbGllZCBleHRlbnNpdmVseSANCg0KICAtIGluIHNwZWVjaCByZWNvZ25pdGlvbiANCiAgLSBhbmQgbWFjaGluZSB0cmFuc2xhdGlvbiB0ZWNobm9sb2dpZXMuDQoNCiMjIyMjIENvbnZvbHV0aW9uYWwgTmV1cmFsIE5ldHdvcmsNCg0KLSBBIGNvbnZvbHV0aW9uYWwgbmV1cmFsIG5ldHdvcmsoQ05OKSANCg0KICAtIHVzZXMgYSB2YXJpYXRpb24gb2YgdGhlIG11bHRpbGF5ZXIgcGVyY2VwdHJvbnMuIA0KDQpBIENOTiBjb250YWlucyBvbmUgb3IgbW9yZSB0aGFuIG9uZSBjb252b2x1dGlvbmFsIGxheWVycy4gDQoNCiAgLSBUaGVzZSBsYXllcnMgY2FuIGVpdGhlciBiZSANCiAgICAtIGNvbXBsZXRlbHkgaW50ZXJjb25uZWN0ZWQgDQogICAgLSBvciBwb29sZWQuDQoNCkJlZm9yZSBwYXNzaW5nIHRoZSByZXN1bHQgdG8gdGhlIG5leHQgbGF5ZXIsIA0KDQogIC0gdGhlIGNvbnZvbHV0aW9uYWwgbGF5ZXIgDQogICAgLSB1c2VzIGEgY29udm9sdXRpb25hbCBvcGVyYXRpb24gb24gdGhlIGlucHV0LiANCiAgLSBEdWUgdG8gdGhpcyBjb252b2x1dGlvbmFsIG9wZXJhdGlvbiwgDQogICAgLSB0aGUgbmV0d29yayBjYW4gYmUgbXVjaCBkZWVwZXIgDQogICAgLSBidXQgd2l0aCBtdWNoIGZld2VyIHBhcmFtZXRlcnMuDQoNCkR1ZSB0byB0aGlzIGFiaWxpdHksIGNvbnZvbHV0aW9uYWwgbmV1cmFsIG5ldHdvcmtzIHNob3cgdmVyeSBlZmZlY3RpdmUgcmVzdWx0cyANCg0KICAtIGluIGltYWdlIGFuZCB2aWRlbyByZWNvZ25pdGlvbiwgDQogIC0gbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nLCANCiAgLSBhbmQgcmVjb21tZW5kZXIgc3lzdGVtcy4NCg0KQ29udm9sdXRpb25hbCBuZXVyYWwgbmV0d29ya3MgYWxzbyBzaG93IGdyZWF0IHJlc3VsdHMgDQoNCiAgLSBpbiBzZW1hbnRpYyBwYXJzaW5nIGFuZCBwYXJhcGhyYXNlIGRldGVjdGlvbi4gDQoNClRoZXkgYXJlIGFsc28gYXBwbGllZCBpbiANCg0KICAtIHNpZ25hbCBwcm9jZXNzaW5nIA0KICAtIGFuZCBpbWFnZSBjbGFzc2lmaWNhdGlvbi4NCg0KQ05OcyBhcmUgYWxzbyBiZWluZyB1c2VkIGluIGltYWdlIGFuYWx5c2lzIGFuZCByZWNvZ25pdGlvbiBpbiBhZ3JpY3VsdHVyZSANCg0KICAtIHdoZXJlIHdlYXRoZXIgZmVhdHVyZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHNhdGVsbGl0ZXMgDQogICAgLSBsaWtlIExTQVQgDQogIC0gdG8gcHJlZGljdCB0aGUgZ3Jvd3RoIGFuZCB5aWVsZCBvZiBhIHBpZWNlIG9mIGxhbmQuIA0KICANCkhlcmXigJlzIGFuIGltYWdlIG9mIHdoYXQgYSBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrIGxvb2tzIGxpa2UuDQoNCiFbQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29ya10oLi9maWdzL1R5cGVOTi02LUNOTi5wbmcpDQoNCkZpZ3VyZSA2LiBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrDQoNCiFbT3VyIENvbnZOZXQgdXNlZCBmb3IgSW1hZ2UgTWFjaGluZSBMZWFybmluZyBvZiBQViBDZWxsIERlZ3JhZGF0aW9uXSguL2ZpZ3Mvc2RsZS1lbG1sLWNubi5wbmcpDQoNCkZpZ3VyZSA2Yi4gT3VyIENvbnZOZXQgdXNlZCBmb3IgSW1hZ2UgTWFjaGluZSBMZWFybmluZyBvZiBQViBDZWxsIERlZ3JhZGF0aW9uDQoNCiFbVGltZSBzZXJpZXMgZ2lmIG9mIFBWIG1vZHVsZSBkZWdyYWRhdGlvbiBFbGVjdHJvbHVtaW5lc2VudCBJbWFnZXNdKC4vZmlncy9QVm1vZC1FTC1ESC5naWYpDQoNCkZpZ3VyZSA2Yy4gVGltZSBzZXJpZXMgZ2lmIG9mIFBWIG1vZHVsZSBkZWdyYWRhdGlvbiBFbGVjdHJvbHVtaW5lc2VudCBJbWFnZXMNCg0KRnJvbSBvdXIgcGFwZXINCg0KICAtIFsxXUEuTS4gS2FyaW1pLCBKLlMuIEZhZGEsIE0uQS4gSG9zc2FpbiwgUy4gWWFuZywgVC5KLiBQZXNoZWssIEouTC4gQnJhaWQsIFIuSC4gRnJlbmNoLCBBdXRvbWF0ZWQgUGlwZWxpbmUgZm9yIFBob3Rvdm9sdGFpYyBNb2R1bGUgRWxlY3Ryb2x1bWluZXNjZW5jZSBJbWFnZSBQcm9jZXNzaW5nIGFuZCBEZWdyYWRhdGlvbiBGZWF0dXJlIENsYXNzaWZpY2F0aW9uLCBJRUVFIEpvdXJuYWwgb2YgUGhvdG92b2x0YWljcy4gKDIwMTkpIDHigJMxMi4gZG9pOlsxMC4xMTA5L0pQSE9UT1YuMjAxOS4yOTIwNzMyXShodHRwOi8vZHguZG9pLm9yZy8xMC4xMTA5L0pQSE9UT1YuMjAxOS4yOTIwNzMyKS4NCg0KDQoNCiMjIyMjICBSZWN1cnJlbnQgTmV1cmFsIE5ldHdvcmsoUk5OKSDigJMgTG9uZyBTaG9ydCBUZXJtIE1lbW9yeQ0KDQotIEEgUmVjdXJyZW50IE5ldXJhbCBOZXR3b3JrIGlzIGEgdHlwZSBvZiBhcnRpZmljaWFsIG5ldXJhbCBuZXR3b3JrIA0KDQogIC0gaW4gd2hpY2ggdGhlIG91dHB1dCBvZiBhIHBhcnRpY3VsYXIgbGF5ZXIgDQogICAgLSBpcyBzYXZlZCANCiAgICAtIGFuZCBmZWQgYmFjayB0byB0aGUgaW5wdXQuDQogIC0gVGhpcyBoZWxwcyBwcmVkaWN0IHRoZSBvdXRjb21lIG9mIHRoZSBsYXllci4NCg0KVGhlIGZpcnN0IGxheWVyIGlzIGZvcm1lZCBpbiB0aGUgc2FtZSB3YXkgDQoNCiAgLSBhcyBpdCBpcyBpbiB0aGUgZmVlZGZvcndhcmQgbmV0d29yay4gDQogIC0gVGhhdCBpcywgd2l0aCB0aGUgcHJvZHVjdCBvZiANCiAgICAtIHRoZSBzdW0gb2YgdGhlIHdlaWdodHMgYW5kIGZlYXR1cmVzLiANCiAgLSBIb3dldmVyLCBpbiBzdWJzZXF1ZW50IGxheWVycywgDQogICAgLSB0aGUgcmVjdXJyZW50IG5ldXJhbCBuZXR3b3JrIHByb2Nlc3MgYmVnaW5zLg0KDQpGcm9tIGVhY2ggdGltZS1zdGVwIHRvIHRoZSBuZXh0LCANCg0KICAtIGVhY2ggbm9kZSB3aWxsIHJlbWVtYmVyIHNvbWUgaW5mb3JtYXRpb24gDQogICAgLSB0aGF0IGl0IGhhZCBpbiB0aGUgcHJldmlvdXMgdGltZS1zdGVwLiANCiAgLSBJbiBvdGhlciB3b3JkcywgZWFjaCBub2RlIGFjdHMgYXMgYSBtZW1vcnkgY2VsbCANCiAgICAtIHdoaWxlIGNvbXB1dGluZyBhbmQgY2Fycnlpbmcgb3V0IG9wZXJhdGlvbnMuIA0KICAtIFRoZSBuZXVyYWwgbmV0d29yayBiZWdpbnMgd2l0aCB0aGUgZnJvbnQgcHJvcGFnYXRpb24gYXMgdXN1YWwgDQogICAgLSBidXQgcmVtZW1iZXJzIHRoZSBpbmZvcm1hdGlvbiBpdCBtYXkgbmVlZCB0byB1c2UgbGF0ZXIuDQoNCklmIHRoZSBwcmVkaWN0aW9uIGlzIHdyb25nLCANCg0KICAtIHRoZSBzeXN0ZW0gc2VsZi1sZWFybnMgYW5kIHdvcmtzIHRvd2FyZHMgbWFraW5nIA0KICAgIC0gdGhlIHJpZ2h0IHByZWRpY3Rpb24gZHVyaW5nIHRoZSBiYWNrcHJvcGFnYXRpb24uIA0KDQpUaGlzIHR5cGUgb2YgbmV1cmFsIG5ldHdvcmsgaXMgdmVyeSBlZmZlY3RpdmUgaW4gDQoNCiAgLSB0ZXh0LXRvLXNwZWVjaCBjb252ZXJzaW9uIHRlY2hub2xvZ3kuICANCiAgDQpIZXJl4oCZcyB3aGF0IGEgcmVjdXJyZW50IG5ldXJhbCBuZXR3b3JrIGxvb2tzIGxpa2UuDQoNCiFbUmVjdXJyZW50IE5ldXJhbCBOZXR3b3JrKFJOTikg4oCTIExvbmcgU2hvcnQgVGVybSBNZW1vcnldKC4vZmlncy9UeXBlTk4tNy1STk4tTFNUTS5naWYpDQoNCkZpZ3VyZSA3LiBSZWN1cnJlbnQgTmV1cmFsIE5ldHdvcmsoUk5OKSDigJMgTG9uZyBTaG9ydCBUZXJtIE1lbW9yeQ0KDQojIyMjIyBNb2R1bGFyIE5ldXJhbCBOZXR3b3JrDQoNCi0gQSBtb2R1bGFyIG5ldXJhbCBuZXR3b3JrIA0KDQogIC0gaGFzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBuZXR3b3JrcyANCiAgICAtIHRoYXQgZnVuY3Rpb24gaW5kZXBlbmRlbnRseSBhbmQgcGVyZm9ybSBzdWItdGFza3MuIA0KICAtIFRoZSBkaWZmZXJlbnQgbmV0d29ya3MgZG8gbm90IHJlYWxseSBpbnRlcmFjdCB3aXRoIG9yIHNpZ25hbCBlYWNoIG90aGVyIA0KICAgIC0gZHVyaW5nIHRoZSBjb21wdXRhdGlvbiBwcm9jZXNzLiANCiAgLSBUaGV5IHdvcmsgaW5kZXBlbmRlbnRseSB0b3dhcmRzIGFjaGlldmluZyB0aGUgb3V0cHV0Lg0KDQpBcyBhIHJlc3VsdCwgYSBsYXJnZSBhbmQgY29tcGxleCBjb21wdXRhdGlvbmFsIHByb2Nlc3MgDQoNCiAgLSBjYW4gYmUgZG9uZSBzaWduaWZpY2FudGx5IGZhc3RlciANCiAgICAtIGJ5IGJyZWFraW5nIGl0IGRvd24gaW50byBpbmRlcGVuZGVudCBjb21wb25lbnRzLiANCiAgLSBUaGUgY29tcHV0YXRpb24gc3BlZWQgaW5jcmVhc2VzIA0KICAgIC0gYmVjYXVzZSB0aGUgbmV0d29ya3MgYXJlIG5vdCBpbnRlcmFjdGluZyB3aXRoIA0KICAgIC0gb3IgZXZlbiBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlci4gIA0KDQpIZXJl4oCZcyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBhIE1vZHVsYXIgTmV1cmFsIE5ldHdvcmsuDQoNCiFbTW9kdWxhciBOZXVyYWwgTmV0d29ya10oLi9maWdzL1R5cGVOTi04LU1vZHVsZU5OLmdpZikNCg0KRmlndXJlIDguIE1vZHVsYXIgTmV1cmFsIE5ldHdvcmsNCg0KIyMjIyMgU2VxdWVuY2UtVG8tU2VxdWVuY2UgTW9kZWxzDQoNCi0gQSBzZXF1ZW5jZSB0byBzZXF1ZW5jZSBtb2RlbCANCg0KICAtIGNvbnNpc3RzIG9mIHR3byByZWN1cnJlbnQgbmV1cmFsIG5ldHdvcmtzLiANCiAgLSBUaGVyZeKAmXMgYW4gZW5jb2RlciB0aGF0IA0KICAgIC0gcHJvY2Vzc2VzIHRoZSBpbnB1dCANCiAgICAtIGFuZCBhIGRlY29kZXIgdGhhdCBwcm9jZXNzZXMgdGhlIG91dHB1dC4gDQogIC0gVGhlIGVuY29kZXIgYW5kIGRlY29kZXIgY2FuIGVpdGhlciANCiAgICAtIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzDQogICAgLSBvciBkaWZmZXJlbnQgcGFyYW1ldGVycy4gDQogIC0gVGhpcyBtb2RlbCBpcyBwYXJ0aWN1bGFybHkgYXBwbGljYWJsZSANCiAgICAtIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEgDQogICAgLSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGRhdGEuICANCg0KU2VxdWVuY2UtdG8tc2VxdWVuY2UgbW9kZWxzIGFyZSBhcHBsaWVkIG1haW5seSBpbiANCg0KICAtIGNoYXRib3RzLCANCiAgLSBtYWNoaW5lIHRyYW5zbGF0aW9uLCBhbmQgDQogIC0gcXVlc3Rpb24gYW5zd2VyaW5nIHN5c3RlbXMuDQoNCiMjIyMjIFN1bW1hcnkNCg0KLSBUaGVyZSBhcmUgbWFueSB0eXBlcyBvZiBhcnRpZmljaWFsIG5ldXJhbCBuZXR3b3JrcyANCg0KICAtIHRoYXQgb3BlcmF0ZSBpbiBkaWZmZXJlbnQgd2F5cyB0byBhY2hpZXZlIGRpZmZlcmVudCBvdXRjb21lcy4gDQoNClRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IGFib3V0IG5ldXJhbCBuZXR3b3JrcyBpcyB0aGF0IA0KDQogIC0gdGhleSBhcmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpcyBzaW1pbGFyIHRvIGhvdyBuZXVyb25zIGluIHRoZSBicmFpbiB3b3JrLg0KDQpBcyBhIHJlc3VsdCwgdGhleSBhcmUgZGVzaWduZWQgDQoNCiAgLSB0byBsZWFybiBtb3JlIGFuZCBpbXByb3ZlIG1vcmUgDQogIC0gd2l0aCBtb3JlIGRhdGEgYW5kIG1vcmUgdXNhZ2UuIA0KDQpVbmxpa2UgdHJhZGl0aW9uYWwgbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG1zIA0KDQogIC0gd2hpY2ggdGVuZCB0byBzdGFnbmF0ZSBhZnRlciBhIGNlcnRhaW4gcG9pbnQsIA0KICAtIG5ldXJhbCBuZXR3b3JrcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHRydWx5IGdyb3cgDQogICAgLSB3aXRoIG1vcmUgZGF0YSBhbmQgbW9yZSB1c2FnZS4NCg0KVGhhdOKAmXMgd2h5IG1hbnkgZXhwZXJ0cyBiZWxpZXZlIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIG5ldXJhbCBuZXR3b3JrcyANCg0KICAtIHdpbGwgYmUgdGhlIGZ1bmRhbWVudGFsIGZyYW1ld29yayBvbiB3aGljaCANCiAgLSBuZXh0LWdlbmVyYXRpb24gQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2Ugd2lsbCBiZSBidWlsdC4NCg0KIyMjIyBDaXRlcw0KDQojIyMjIyBHZW9mZnJleSBIaW50b24NCg0KICAtIExlYXJuaW5nIFJlcHJlc2VudGF0aW9ucyBieSBCYWNrLXByb3BvZ2F0aW5nIEVycm9ycyBbQHJ1bWVsaGFydExlYXJuaW5nUmVwcmVzZW50YXRpb25zQmFja3Byb3BhZ2F0aW5nMTk4Nl0NCiAgICAtIFZpc3VhbGl6aW5nIERhdGEgdXNpbmcgdC1TTkUgW0BtYWF0ZW5WaXN1YWxpemluZ0RhdGFVc2luZzIwMDhdDQogIC0gRGVlcCBMZWFybmluZyAocmV2aWV3KSBbQGxlY3VuRGVlcExlYXJuaW5nMjAxNV0NCiAgLSBJbWFnZU5ldCBDbGFzc2lmaWNhdGlvbiB3aXRoIERlZXAgQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29ya3MgW0Brcml6aGV2c2t5SW1hZ2VOZXRDbGFzc2lmaWNhdGlvbkRlZXAyMDEyYV0NCiAgLSBJbWFnZU5ldCBDbGFzc2lmaWNhdGlvbiB3aXRoIERlZXAgQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29ya3MgKEFDTSBsZXR0ZXIpIFtAa3JpemhldnNreUltYWdlTmV0Q2xhc3NpZmljYXRpb25EZWVwMjAxN10NCg0KDQojIyMjIyBCbG9ncw0KDQogIC0gQW5rdXJhdGkgTWVodGEgW0EgQ29tcGxldGUgR3VpZGUgdG8gVHlwZXMgb2YgTmV1cmFsIE5ldHdvcmtzXShodHRwczovL3d3dy5kaWdpdGFsdmlkeWEuY29tL2Jsb2cvdHlwZXMtb2YtbmV1cmFsLW5ldHdvcmtzLykgSmFuLiAyNSwgMjAxOQ0KICAtIEZqb2RvciB2YW4gVmVlbiBbVGhlIE5ldXJhbCBOZXR3b3JrIFpvb10oaHR0cDovL3d3dy5hc2ltb3ZpbnN0aXR1dGUub3JnL25ldXJhbC1uZXR3b3JrLXpvby8pLCBTZXB0LiAxNCwgMjAxNg0KICAtIEZqb2RvciB2YW4gVmVlbiBbVGhlIE5ldXJhbCBOZXR3b3JrIFpvbyBQcmVxdWVsOiBDZWxscyBhbmQgTGF5ZXJzIF0oaHR0cHM6Ly93d3cuYXNpbW92aW5zdGl0dXRlLm9yZy9hdXRob3IvZmpvZG9ydmFudmVlbi8pLCBTZXB0LiAxNCwgMjAxNg0KICANCiMjIyMgUmVmZXJlbmNlcw0KDQoNCg0K